GreenShade · Division report

{{ divisionName }} P&L

{{ sourceLine }}
{{ connLabel }}
{{ saveError }}
One link, one set of numbers
Point this report at a Supabase table and every figure — typed or imported — lands in one place. AP posts a cost in the shop, it appears on your screen without a refresh. Until it is connected the report runs local-only, saving to whichever browser you are in.
{{ connMsg }}
Run this once in the Supabase SQL editor
{{ sql }}
Getting it onto a real link
1Create the Supabase project and run the SQL on the left.
2Paste the URL and anon key into pl-config.js so the deployed site connects for everyone, not just this browser.
3Push the project to GitHub and connect that repo in Netlify — same as the shop board.
4Send the Netlify link to AP and the division manager. Nothing to install, nothing to email back.
Worth knowing
The anon key in the page can read and write these two tables and nothing else — no other data sits in that project. Anyone with the Netlify link can post a figure, so treat the link the way you would treat the spreadsheet. If you want it locked to your staff, Supabase magic-link sign-in is a small addition on top of this.
Drop in the QuickBooks export
Any Profit & Loss by Month export works — the .xlsx QuickBooks writes, a .csv, or a block copied straight out of Excel. Accounts are matched on their number, months are read from the column headers, and anything new is listed for you before a single figure changes.
Drop the workbook here
.xlsx or .csv — nothing leaves this browser
Or paste it
{{ importError }}
{{ pendingTitle }}
Months read
{{ m.label }}
Accounts matched
{{ pendingMatched }}
Figures changed
{{ pendingChanged }}
{{ unmappedTitle }}
{{ u.name }}
For accounting — the export to run
1In QuickBooks open Profit & Loss for the maintenance division and set Columns: Month.
2Set the range to 1 January through today — always the full year, not a single month.
3Excel → Create New Worksheet → Export, save it, and drop that file here.
4Re-run it whenever costs post. Each import overwrites the months it covers and leaves every other month alone.
Between imports
Nothing stops AP typing a known cost straight into the report tab before it reaches QuickBooks — a subcontractor invoice, a fuel bill. The next import replaces it with the booked figure.
{{ openHeadline }}
{{ openBody }}
{{ openPctLabel }}
{{ openPostedLabel }}
accounts carry a figure
Revenue · year to date
{{ kpiRevenue }}
{{ kpiRevenueMeta }}
Labor · payroll expenses
{{ kpiLabor }}
{{ kpiLaborMeta }}
Total costs · year to date
{{ kpiCost }}
{{ kpiCostMeta }}
Net income · year to date
{{ kpiNet }}
{{ kpiNetMeta }}
Has a figure Nothing posted {{ rowCountLabel }}
Account
{{ m.label }}
{{ m.sub }}
{{ ytdHead }}
% of rev
{{ row.label }} costs still landing
{{ c.text }}
{{ row.ytd }}
{{ row.pct }}
Entering by hand. Click any month cell on an account line and type, or just start typing down a column — Enter or ↓ jumps to the next row, ↑ goes back up, focus selects the whole figure for a fast overwrite. Paste a copied block into the first cell to fill many rows and months at once. Escape cancels.
Keeping it current. The import tab is the fast path — accounting drops in a fresh QuickBooks export and the whole report re-reads in one step, new months included.
Where it lives. Imports and typed figures save to this link in whichever browser made them. For AP and ownership to see each other's numbers without passing a file, this needs a shared backend — that is the next step whenever you want it.